package schame使用xsd;

【xsd简介】   https://www.w3school.com.cn/schema/index.asp
XML Schema 是基于 XML 的 DTD 替代者。
XML Schema 可描述 XML 文档的结构。
XML Schema 语言也可作为 XSD（XML Schema Definition）来引用。

您应当具备的基础知识
在继续学习之前，您需要对下面的知识有基本的了解：

▪HTML / XHTML
▪XML 以及 XML 命名空间
▪对 DTD 的基本了解:DTD文档类型定义(Document Type Definition)

【内部的 DOCTYPE 声明】
假如 DTD 被包含在您的 XML 源文件中，它应当通过下面的语法包装在一个 DOCTYPE 声明中：

<!DOCTYPE root-element [element-declarations]>
带有 DTD 的 XML 文档实例（请在 IE5 以及更高的版本打开，并选择查看源代码）：

<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend</body>
</note>

在您的浏览器中打开此 XML 文件，并选择"查看源代码"命令。

The DTD above is interpreted like this:

!DOCTYPE note (第二行)定义此文档是 note 类型的文档。
!ELstrongENT note (第三行)定义 note 元素有四个元素："to、from、heading,、body"
!ELstrongENT to (第四行)定义 to 元素为 "#PCDATA" 类型
!ELstrongENT from (第五行)定义 frome 元素为 "#PCDATA" 类型
!ELstrongENT heading (第六行)定义 heading 元素为 "#PCDATA" 类型
!ELstrongENT body (第七行)定义 body 元素为 "#PCDATA" 类型

【外部文档声明】
假如 DTD 位于 XML 源文件的外部，那么它应通过下面的语法被封装在一个 DOCTYPE 定义中：

<!DOCTYPE root-element SYSTEM "filename">

这个 XML 文档和上面的 XML 文档相同，但是拥有一个外部的 DTD: （点击打开该文件，并选择"查看源代码"命令。）

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

这是包含 DTD 的 "note.dtd" 文件：

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>


什么是 XML Schema？
XML Schema 的作用是定义 XML 文档的合法构建模块，类似 DTD。

XML Schema:

▪定义可出现在文档中的元素
▪定义可出现在文档中的属性
▪定义哪个元素是子元素
▪定义子元素的次序
▪定义子元素的数目
▪定义元素是否为空，或者是否可包含文本
▪定义元素和属性的数据类型
▪定义元素和属性的默认值以及固定值

XML Schema 是 DTD 的继任者
我们认为 XML Schema 很快会在大部分网络应用程序中取代 DTD。

理由如下：
▪XML Schema 可针对未来的需求进行扩展
▪XML Schema 更完善，功能更强大
▪XML Schema 基于 XML 编写
▪XML Schema 支持数据类型
▪XML Schema 支持命名空间

XML Schema 是 W3C 标准
XML Schema 在 2001 年 5 月 2 日成为 W3C 标准。

您可以在我们的《W3C 教程》中获得更多有关 XML Schema 标准的信息。

【为何使用xsd】
XML Schema 比 DTD 更强大。

XML Schema 支持数据类型
XML Schema 最重要的能力之一就是对数据类型的支持。

通过对数据类型的支持：
▪可更容易地描述允许的文档内容
▪可更容易地验证数据的正确性
▪可更容易地与来自数据库的数据一并工作
▪可更容易地定义数据约束（data facets）
▪可更容易地定义数据模型（或称数据格式）
▪可更容易地在不同的数据类型间转换数据

编者注：数据约束，或称 facets，是 XML Schema 原型中的一个术语，中文可译为“面”，用来约束数据类型的容许值。

XML Schema 使用 XML 语法
另一个关于 XML Schema 的重要特性是，它们由 XML 编写。

由 XML 编写 XML Schema 有很多好处：
▪不必学习新的语言
▪可使用 XML 编辑器来编辑 Schema 文件
▪可使用 XML 解析器来解析 Schema 文件
▪可通过 XML DOM 来处理 Schema
▪可通过 XSLT 来转换 Schema

XML Schema 可保护数据通信
当数据从发送方被发送到接受方时，其要点是双方应有关于内容的相同的“期望值”。

通过 XML Schema，发送方可以用一种接受方能够明白的方式来描述数据。

一种数据，比如 "03-11-2004"，在某些国家被解释为11月3日，而在另一些国家为当作3月11日。

但是一个带有数据类型的 XML 元素，比如：<date type="date">2004-03-11</date>，可确保对内容一致的理解，这是因为 XML 的数据类型 "date" 要求的格式是 "YYYY-MM-DD"。

XML Schema 可扩展
XML Schema 是可扩展的，因为它们由 XML 编写。

通过可扩展的 Schema 定义，您可以：
▪在其他 Schema 中重复使用您的 Schema
▪创建由标准类型衍生而来的您自己的数据类型
▪在相同的文档中引用多重的 Schema

形式良好是不够的
我们把符合 XML 语法的文档称为形式良好的 XML 文档，比如：

▪它必须以 XML 声明开头
▪它必须拥有唯一的根元素
▪开始标签必须与结束标签相匹配
▪元素对大小写敏感
▪所有的元素都必须关闭
▪所有的元素都必须正确地嵌套
▪必须对特殊字符使用实体
即使文档的形式良好，仍然不能保证它们不会包含错误，并且这些错误可能会产生严重的后果。

请考虑下面的情况：您订购的了 5 打激光打印机，而不是 5 台。通过 XML Schema，大部分这样的错误会被您的验证软件捕获到。

【xsd如何使用】

XML 文档可对 DTD 或 XML Schema 进行引用。

●一个简单的 XML 文档：
请看这个名为 "note.xml" 的 XML 文档：

<?xml version="1.0"?>
<note>
	<to>George</to>
	<from>John</from>
	<heading>Reminder</heading>
	<body>Don't forget the meeting!</body>
</note>

●DTD 文件
下面这个例子是名为 "note.dtd" 的 DTD 文件，它对上面那个 XML 文档的元素进行了定义：

<!ELEMENT note (to, from, heading, body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
第 1 行定义 note 元素有四个子元素："to, from, heading, body"。

第 2-5 行定义了 to, from, heading, body 元素的类型是 "#PCDATA"。

●XML Schema
下面这个例子是一个名为 "note.xsd" 的 XML Schema 文件，它定义了上面那个 XML 文档的元素：

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn"
elementFormDefault="qualified">

<xs:element name="note">
    <xs:complexType>
      <xs:sequence>
      	<xs:element name="to" type="xs:string"/>
      	<xs:element name="from" type="xs:string"/>
      	<xs:element name="heading" type="xs:string"/>
      	<xs:element name="body" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
</xs:element>

</xs:schema>
note 元素是一个复合类型，因为它包含其他的子元素。其他元素 (to, from, heading, body) 是简易类型，因为它们没有包含其他元素。您将在下面的章节学习更多有关
复合类型和简易类型的知识。

●对 DTD 的引用
此文件包含对 DTD 的引用：

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "http://www.w3school.com.cn/dtd/note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>

●对 XML Schema 的引用
此文件包含对 XML Schema 的引用：

<?xml version="1.0"?>
<note
xmlns="http://www.w3school.com.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3school.com.cn note.xsd">

<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>

【xsd schame】
<schema> 元素是每一个 XML Schema 的根元素。

●<schema> 元素
<schema> 元素是每一个 XML Schema 的根元素：

<?xml version="1.0"?>

<xs:schema>

...
...

</xs:schema>
<schema> 元素可包含属性。一个 schema 声明往往看上去类似这样：

<?xml version="1.0"?>
 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn"
elementFormDefault="qualified">

...
...
</xs:schema>

●代码解释：
下面的片断：xmlns:xs="http://www.w3.org/2001/XMLSchema"
显示 schema 中用到的元素和数据类型来自命名空间 "http://www.w3.org/2001/XMLSchema"。同时它还规定了来自命名
空间 "http://www.w3.org/2001/XMLSchema" 的元素和数据类型应该使用前缀 xs：

这个片断：targetNamespace="http://www.w3school.com.cn" 
显示被此 schema 定义的元素 (note, to, from, heading, body) 来自命名空间： "http://www.w3school.com.cn"。

这个片断：xmlns="http://www.w3school.com.cn" 
指出默认的命名空间是 "http://www.w3school.com.cn"。

这个片断：elementFormDefault="qualified" 
指出任何 XML 实例文档所使用的且在此 schema 中声明过的元素必须被命名空间限定。

●在 XML 文档中引用 Schema
此 XML 文档含有对 XML Schema 的引用：

<?xml version="1.0"?>

<note xmlns="http://www.w3school.com.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3school.com.cn note.xsd">

<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>

●代码解释：
下面的片断：xmlns="http://www.w3school.com.cn" 
规定了默认命名空间的声明。此声明会告知 schema 验证器，在此 XML 文档中使用的所有元素都被声明于 "http://www.w3school.com.cn" 这个命名空间。

一旦您拥有了可用的 XML Schema 实例命名空间：xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
您就可以使用 schemaLocation 属性了。此属性有两个值。第一个值是需要使用的命名空间。第二个值是供命名空间使用的 XML schema 的位置：

xsi:schemaLocation="http://www.w3school.com.cn note.xsd"